package com.pzhuweb.sgblog.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pzhuweb.sgblog.domain.entity.Menu;
import com.pzhuweb.sgblog.domain.utils.ResponseResult;
import com.pzhuweb.sgblog.mapper.MenuMapper;
import com.pzhuweb.sgblog.service.MenuService;
import com.pzhuweb.sgblog.domain.utils.SecurityUtils;
import com.pzhuweb.sgblog.domain.vo.MenuVo;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;


/**
 * @author 鄧浩奇
 * @classname MenuServiceImpl
 * @description
 * @since 2023/8/6 17:35
 **/

@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {
    @Override
    public List<String> getPermsByUserId(Long id) {
        // id 为1的是管理员，返回所有权限
        if (SecurityUtils.isAdmin()) {
            LambdaQueryWrapper<Menu> wrapper = new LambdaQueryWrapper<>();
            // 如果用户id为1代表管理员，roles 中只需要有admin，permissions中需要有所有菜单类型为C或者F的，状态为正常的，未被删除的权限
            wrapper.in(Menu::getMenuType, "C", "F").eq(Menu::getStatus, 0);
            List<Menu> menus = list(wrapper);
            return menus.stream().map(Menu::getPerms).toList();
        }
        // 不是管理员，返回所具有的权限,用户id查询角色id，根据角色id查有哪些权限
        return getBaseMapper().selectPermsByUserId(id);
    }

    @Override
    public List<MenuVo> selectMenuTreeByUserId(Long userID) {
        MenuMapper menuMapper = getBaseMapper();
        List<MenuVo> menuVos = null;
        // 判断是不是管理员
        if (SecurityUtils.isAdmin()) {
            // 是的话就返回所有的路由信息
            menuVos = menuMapper.selectAllRouterMenu();
        } else
            menuVos = menuMapper.selectRouterMenuTreeByUserId(userID);
        // 构建menuTree;
        return builderMenuTree(menuVos, 0L);
    }


    private List<MenuVo> builderMenuTree(List<MenuVo> menuVos, long parentId) {
        return menuVos.stream()
                .filter(menuVo -> menuVo.getParentId().equals(parentId))
                .map(menuVo -> menuVo.setChildren(getChildren(menuVo, menuVos)))
                .collect(Collectors.toList());
    }


    /*
     * 获取存入参数的子menu集合
     * */
    private List<MenuVo> getChildren(MenuVo menuVo, List<MenuVo> menuVos) {
        return menuVos.stream()
                .filter(m -> m.getParentId().equals(menuVo.getId()))
                .map(m -> m.setChildren(getChildren(m, menuVos)))
                .collect(Collectors.toList());
    }

}
